package fr.afcepf.atod16.groupe1.projet1.service;

import fr.afcepf.atod16.groupe1.projet1.dao.catalogue.DaoProduit;
import fr.afcepf.atod16.groupe1.projet1.dao.commande.DaoCommande;
import fr.afcepf.atod16.groupe1.projet1.dao.commande.DaoLigneCommande;
import fr.afcepf.atod16.groupe1.projet1.dto.catalogue.DtoProduit;
import fr.afcepf.atod16.groupe1.projet1.dto.client.DtoCompteClient;
import fr.afcepf.atod16.groupe1.projet1.dto.commande.DtoCommande;
import fr.afcepf.atod16.groupe1.projet1.dto.commande.DtoLigneCommande;
import fr.afcepf.atod16.groupe1.projet1.dto.util.DtoAdresse;
import fr.afcepf.atod16.groupe1.projet1.dto.util.DtoProduitPanier;
import fr.afcepf.atod16.groupe1.projet1.enumerations.EtatLivraison;
import fr.afcepf.atod16.groupe1.projet1.enumerations.Paiement;
import fr.afcepf.atod16.groupe1.projet2.servicecommande.ActivationException_Exception;
import fr.afcepf.atod16.groupe1.projet2.servicecommande.InvalidArgumentException_Exception;
import fr.afcepf.atod16.groupe1.projet2.servicecommande.NotExistException_Exception;
import fr.afcepf.atod16.groupe1.projet2.servicecommande.ServiceCommandeStockWebservice;
import fr.afcepf.atod16.groupe1.projet2.servicecommande.StockException_Exception;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateful;

/**
 *
 * @author stagiaire
 */
@Stateful
public class ServiceCommande implements ServiceCommandeLocal{

    DtoCommande commande = new DtoCommande();
    
    @EJB
    DaoCommande daoCommande;
    
    @EJB
    DaoProduit daoProduit;
    
    @EJB
    DaoLigneCommande daoLigneCommande;
    
    @EJB
    ServiceMailLocal serviceMail;
    
    Integer etapeCommande = 1;
    
    @Override
    public Boolean setLignesCommande(ArrayList<DtoProduitPanier> produitsList) {
        
        Integer prixTotal = 0;
        
        List<DtoLigneCommande> lignesCommandes = new ArrayList<DtoLigneCommande>();
        for(DtoProduitPanier p : produitsList){
            DtoProduit produit  = daoProduit.getProduitByFicheId(p.getProduitVignette().getId());
            
            DtoLigneCommande ligneCommande = new DtoLigneCommande();
            ligneCommande.setProduit(produit);
            ligneCommande.setQuantite(p.getQuantite());
            ligneCommande.setRemise(0);
            ligneCommande.setCommande(commande);
            ligneCommande.setPrixUnitaire(p.getProduitVignette().getPrix());
            lignesCommandes.add(ligneCommande);
            prixTotal = p.getProduitVignette().getPrix() * p.getQuantite();
        }
        
        //On set les articles du panier dans les lignesCommande du DtoCommande
        commande.setLignes(lignesCommandes);
        
        
        prixTotal =+ prixTotal + commande.getFraisLivraison();
        //On set le prix total de la commande
        commande.setTotal(prixTotal);       
           
        return true;
    }

    @Override
    public List<DtoLigneCommande> getLignesCommandes() {
        return commande.getLignes();
    }

    @Override
    public DtoCommande getCommande() {
        return commande;
    }

    @Override
    public DtoCommande getCommandeById(Integer idCommande) {
        return daoCommande.rechercherParId(idCommande);
    }

    @Override
    public Boolean setAdresseFacturation(DtoAdresse adresseFacturation) {
        commande.setCiviliteFacturation(adresseFacturation.getCivilite());
        commande.setNomFacturation(adresseFacturation.getNom());
        commande.setPrenomFacturation(adresseFacturation.getPrenom());
        commande.setAdresseFacturation(adresseFacturation.getAdresse());
        commande.setCodePostalFacturation(adresseFacturation.getCodePostal());
        commande.setVilleFacturation(adresseFacturation.getVille());
        commande.setTelFixeFacturation(adresseFacturation.getTelFixe());
        commande.setTelMobileFacturation(adresseFacturation.getTelMobile());
        return true;
    }

    @Override
    public Boolean setAdresseLivraison(DtoAdresse adresseLivraison) {
        commande.setCiviliteLivraison(adresseLivraison.getCivilite());
        commande.setNomLivraison(adresseLivraison.getNom());
        commande.setPrenomLivraison(adresseLivraison.getPrenom());
        commande.setAdresseLivraison(adresseLivraison.getAdresse());
        commande.setCodePostalLivraison(adresseLivraison.getCodePostal());
        commande.setVilleLivraison(adresseLivraison.getVille());
        commande.setTelFixeLivraison(adresseLivraison.getTelFixe());
        commande.setTelMobileLivraison(adresseLivraison.getTelMobile());
        return true;
    }

    @Override
    public Integer getFraisLivraison(String modeLivraison) {
        return commande.getFraisLivraison();
    }
    
    @Override
    public Boolean setFraisLivraison(Integer fraisLivraison) {
            commande.setFraisLivraison(fraisLivraison);
            return true;
    }
    
    @Override
    public Boolean setModeLivraison(String modeLivraison) {
              commande.setModeLivraison(modeLivraison);
              return true;
    }

    @Override
    public Integer getEtapeCommande() {
        return etapeCommande;
    }
    
    @Override
    public Boolean resetEtapeCommande() {
        commande = new DtoCommande();
        etapeCommande = 1;
        return true;
    }

    @Override
    public Boolean validerPaiement() {
        commande.setDateCreation(new Date(System.currentTimeMillis()));
        commande.setPaiement(Paiement.CB);
        commande.setEtatLivraison(EtatLivraison.PAYE);
      Integer idCommande =  daoCommande.ajouter(commande);
      
      //Changement du DtoCommande (Projet1) en DtoCommande (Projet2)
      fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoCommande dtoCommande =new fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoCommande();
      dtoCommande.setAdresseLivraison(commande.getAdresseLivraison());
      dtoCommande.setCiviliteLivraison(commande.getCiviliteLivraison());
      dtoCommande.setCodePostalLivraison(commande.getCodePostalLivraison());
      dtoCommande.setIdSite(idCommande);
      dtoCommande.setModeLivraison(commande.getModeLivraison());
      dtoCommande.setNomLivraison(commande.getNomLivraison());
      dtoCommande.setPrenomLivraison(commande.getPrenomLivraison());
      dtoCommande.setTelFixeLivraison(commande.getTelFixeLivraison());
      dtoCommande.setTelMobileLivraison(commande.getTelMobileLivraison());
      dtoCommande.setVilleLivraison(commande.getVilleLivraison());
      
      //Creation des DtoLignesCommandes du projet 2
      List<fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoLigneCommande> listDtoCommande = new ArrayList<fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoLigneCommande>();
      for(DtoLigneCommande ligneProjet1 : commande.getLignes()){
      fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoLigneCommande ligne = new fr.afcepf.atod16.groupe1.projet2.servicecommande.DtoLigneCommande();
      ligne.setCodeEAN13(ligneProjet1.getProduit().getCodeEAN13());
      ligne.setQuantite(ligneProjet1.getQuantite());
      listDtoCommande.add(ligne);
      }
      dtoCommande.setLigneProduit(listDtoCommande);
      ServiceCommandeStockWebservice webService =  new fr.afcepf.atod16.groupe1.projet2.servicecommande.ServiceCommande().getServiceCommandeStockPort();
      
        try {
            webService.creerCommande(dtoCommande);
            serviceMail.envoyerMailConfirmationCommande(commande);
        } catch (ActivationException_Exception ex) {
            Logger.getLogger(ServiceCommande.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidArgumentException_Exception ex) {
            Logger.getLogger(ServiceCommande.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotExistException_Exception ex) {
            Logger.getLogger(ServiceCommande.class.getName()).log(Level.SEVERE, null, ex);
        } catch (StockException_Exception ex) {
            Logger.getLogger(ServiceCommande.class.getName()).log(Level.SEVERE, null, ex);
        }
        return true;
    }

    @Override
    public void reponseBanque(Boolean confirmationDuPaiement) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Boolean setCompteClient(DtoCompteClient compteClient) {
        commande.setCompteClient(compteClient);
        return true;
    }


    
}
